package cn.jtfadmin.core.modules.sys.controller;


import cn.jtfadmin.base.dict.dto.DictItemModelDTO;
import cn.jtfadmin.base.dict.service.DictEntityService;
import cn.jtfadmin.base.lang.common.domain.dto.AntdvTreeDataRDTO;
import cn.jtfadmin.base.lang.common.domain.dto.ResultDTO;
import cn.jtfadmin.base.lang.common.domain.dto.SpecPDTO;
import cn.jtfadmin.base.lang.common.domain.dto.TreeRDTO;
import cn.jtfadmin.base.lang.common.service.BaseTreeService;
import cn.jtfadmin.base.lang.config.excel.ExcelWeb;
import cn.jtfadmin.core.modules.sys.domain.dto.SysDepartAddPDTO;
import cn.jtfadmin.core.modules.sys.domain.dto.SysDepartEditPDTO;
import cn.jtfadmin.core.modules.sys.domain.dto.SysDepartModelDTO;
import cn.jtfadmin.core.modules.sys.domain.entity.SysDepartEntity;
import lombok.AllArgsConstructor;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.validation.constraints.NotBlank;
import java.io.IOException;
import java.util.List;

/**
 * 后管-系统部门管理
 *
 * @author jtf
 * @since 1.0
 */
@RestController
@Validated
@AllArgsConstructor
public class SysDepartController {

    private BaseTreeService<SysDepartEntity> service;

    private DictEntityService<SysDepartEntity> dictEntityService;

    /**
     * 查询SysDepartEntity树
     * @param specPDTO 查询条件
     * @return 返回树结构
     */
    @GetMapping(value = "/sys/depart/list")
    public ResultDTO<List<TreeRDTO<SysDepartModelDTO>>> list(SpecPDTO<SysDepartEntity> specPDTO) {
        return ResultDTO.successData(service.findTree(specPDTO, SysDepartModelDTO.class));
    }


    /**
     * 新增SysDepartEntity
     *
     * @param addPDTO 增增参数
     * @return 无
     */
    @RequestMapping(value = "/sys/depart/add", method = RequestMethod.POST)
    public ResultDTO<String> add(@RequestBody @Validated SysDepartAddPDTO addPDTO) {
        return ResultDTO.successData(service.add(addPDTO).getId());
    }

    /**
     * 修改 SysDepartEntity
     *
     * @param editPDTO 修改参数
     * @return 无
     */
    @PutMapping(value = "/sys/depart/edit")
    public ResultDTO<String> edit(@RequestBody @Validated SysDepartEditPDTO editPDTO) {
        return ResultDTO.successData(service.edit(editPDTO).getId());
    }


    /**
     * 按照id删除 SysDepartEntity
     *
     * @param id id
     * @return 无
     */
    @DeleteMapping(value = "/sys/depart/del")
    public ResultDTO<String> del(@RequestParam() @NotBlank String id) {
         service.deleteById(id);
        return ResultDTO.success();
    }

    /**
     * 批量删除 SysDepartEntity
     *
     * @param ids 查询条件
     * @return 分页数据
     */
    @DeleteMapping(value = "/sys/depart/delBatch")
    public ResultDTO<String> delBatch(@RequestParam() @NotBlank String ids) {
        service.deleteBatch(ids);
        return ResultDTO.success();
    }

    /**
     * 查询antdTree
     *
     * @param columns 命名列
     * @return 无
     */
    @GetMapping(value = "/sys/depart/tree")
    public ResultDTO<List<AntdvTreeDataRDTO>> findAntdvTreeDataRDTO(String columns) {
        return ResultDTO.successData(service.findAntdTree(columns));
    }


    /**
     * 获取用户字典
     * @param specPDTO
     * @param columns
     * @return
     */
    @GetMapping(value = "/sys/depart/named")
    public ResultDTO<List<DictItemModelDTO>> named(SpecPDTO<SysDepartEntity> specPDTO, String columns, String keyField){
        List<DictItemModelDTO> dictModel = dictEntityService.findDictModelListBySpec(columns, specPDTO, keyField);
        return ResultDTO.successData(dictModel);
    }


    /**
     * 导入excel
     *
     * @param file
     * @return
     */
    @PostMapping("/sys/depart/importExcel")
    public ResultDTO<String> importExcel(MultipartFile file) throws IOException {
        service.importExcel(file.getInputStream());
        return ResultDTO.success();
    }


    /**
     * 导出excel
     */
    @GetMapping("/sys/depart/exportExcel")
    public void exportExcel(SpecPDTO<SysDepartEntity> specPDTO) {
        service.exportExcel(specPDTO, ExcelWeb.addCurrentResposeHeader("组织机构"));
    }
}
